package com.balabala.gym_user.service.impl;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.balabala.gym_user.constant.VipCardConstant;
import com.balabala.gym_user.mapper.UserVipCardMapper;
import com.balabala.gym_user.pojo.dto.AddRecordDTO;
import com.balabala.gym_user.pojo.dto.AddUserVipCardDto;
import com.balabala.gym_user.pojo.dto.UserVipCardQueryDTO;
import com.balabala.gym_user.pojo.dto.UserVipCardStatusDTO;
import com.balabala.gym_user.pojo.entity.CardConsumeRecord;
import com.balabala.gym_user.pojo.entity.User;
import com.balabala.gym_user.pojo.entity.UserVipCard;
import com.balabala.gym_user.pojo.entity.VipCard;
import com.balabala.gym_user.pojo.vo.UserVipCardInfoVO;
import com.balabala.gym_user.pojo.vo.UserVipCardPageVO;
import com.balabala.gym_user.service.CardConsumeRecordService;
import com.balabala.gym_user.service.UserService;
import com.balabala.gym_user.service.UserVipCardService;
import com.balabala.gym_user.service.VipCardService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author 何涛
 * @Date: 2023/05/01/ 17:34
 * @description 用户会员卡实现类
 */
@Slf4j
@Service
public class UserVipCardServiceImpl extends ServiceImpl<UserVipCardMapper, UserVipCard> implements UserVipCardService {
    @Autowired
    public  VipCardService vipCardService;
    @Autowired
    public  CardConsumeRecordService cardConsumeRecordService;
    @Autowired
    public UserService userService;
    @Override
    public PageInfo<UserVipCardPageVO> userVipCardPageList(UserVipCardQueryDTO userVipCardQueryDto) {
        PageHelper.startPage(userVipCardQueryDto.getPage(),userVipCardQueryDto.getLimit());
        List<UserVipCardPageVO> userVipCardPageVoList=baseMapper.userVipCardPageList(userVipCardQueryDto);
        PageInfo<UserVipCardPageVO> userVipCardPageVoPageInfo=new PageInfo<>(userVipCardPageVoList);
        return userVipCardPageVoPageInfo;
    }

    @Override
    public Boolean changeUserVipCardStatus(UserVipCardStatusDTO userVipCardStatusDto) {
        UserVipCard userVipCard=new UserVipCard();
        BeanUtils.copyProperties(userVipCardStatusDto,userVipCard);
        UpdateWrapper<UserVipCard> updateWrapper=new UpdateWrapper();
        updateWrapper.set("card_status",userVipCardStatusDto.getCardStatus());
        updateWrapper.set("id",userVipCardStatusDto.getId());
        update(updateWrapper);
        return true;
    }

    @Override
    public UserVipCardInfoVO findUserCardInfo(Long user_card_id) {
        UserVipCardInfoVO userVipCardInfoVo=baseMapper.findUserCardInfoById(user_card_id);
        if(userVipCardInfoVo.getCardType().equals(VipCardConstant.CARD_TYPE_TIME) ){
            log.info("该会员会员卡为期卡，计算到期时间");
            //根据用户会员卡id查询期卡的总天数
            Integer day=baseMapper.findVipCardDay(user_card_id);
            Long dayMs=day*DateUnit.DAY.getMillis();
            Date createTime = userVipCardInfoVo.getCreateTime();
            Long  elapsedTime= DateUtil.between(createTime, new Date(), DateUnit.DAY);

            if(elapsedTime>dayMs){
                //说明已经过期了
                userVipCardInfoVo.setExpirationDay(0L);
            }
            else {
                Long remainDay=dayMs-elapsedTime/(DateUnit.DAY.getMillis());
                userVipCardInfoVo.setExpirationDay(remainDay);
            }

        }
        else {
            //不是期卡则永久有效
            userVipCardInfoVo.setExpirationDay(-1L);
        }
        return userVipCardInfoVo;
    }

    @Override
    public List<String> findUserCardNameByUserId(Long userId) {
//        return list(new LambdaQueryWrapper<UserVipCard>().eq(UserVipCard::getUserId, userId)).stream()
//                .map(userVipCard -> vipCardService.findById(userVipCard.getVipCardId()).getName())
//                .collect(Collectors.toList());
        return getBaseMapper().findUserCardNameByUserId(userId);
    }

    @Override
    public Boolean renewal(AddRecordDTO addRecordDTO) {
        //获取会员卡类型
        UserVipCard userVipCard = getById(addRecordDTO.getUserCardId());
        LambdaUpdateWrapper<UserVipCard> updateWrapper=new LambdaUpdateWrapper<>();
        VipCard vipCard = vipCardService.getById(userVipCard.getVipCardId());
        if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_COUNT)) {
            //说明是次卡
            log.info("正在续费次卡，增加次数：{}",addRecordDTO.getChange());
            userVipCard.setUserCardCount(userVipCard.getUserCardCount()+Integer.valueOf(addRecordDTO.getChange()));
            updateWrapper.set(UserVipCard::getUserCardCount,userVipCard.getUserCardCount());
        }
        else if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_MONEY)){
            //说明是储值卡
            log.info("正在充值储值卡，充值：{}元",addRecordDTO.getChange());
            Long total=userVipCard.getRemainAmount()+addRecordDTO.getMoney()*100;
            userVipCard.setRemainAmount(total);
            updateWrapper.set(UserVipCard::getRemainAmount,userVipCard.getRemainAmount());
        }
        update(userVipCard,updateWrapper);
        log.info("修改完毕，添加消费记录");

        cardConsumeRecordService.save(
                CardConsumeRecord.builder()
                        .userCardId(addRecordDTO.getUserCardId()).userId(userVipCard.getUserId())
                        .change(addRecordDTO.getChange()).illustrate(addRecordDTO.getIllustrate())
                        .amount(addRecordDTO.getMoney()*100).status(userVipCard.getCardStatus())
                        .createTime(new Date()).build()
        );
        return true;
    }

    @Override
    public List<UserVipCardInfoVO> getUserCardInfoByUserId(Long userId) {
        List<UserVipCard> userVipCards = list(new LambdaQueryWrapper<UserVipCard>().eq(UserVipCard::getUserId, userId));
        List<UserVipCardInfoVO> userVipCardInfoVOS = userVipCards.stream().map(userVipCard ->{
            //查询会员卡信息
            VipCard vipCard = vipCardService.getById(userVipCard.getVipCardId());
            //查询用户信息
            User user = userService.getById(userVipCard.getUserId());
            UserVipCardInfoVO userVipCardInfoVO = UserVipCardInfoVO.builder().id(userVipCard.getId())
                    .cardStatus(userVipCard.getCardStatus())
                    .remark(vipCard.getRemark())
                    .phone(user.getPhone())
                    .username(user.getName())
                    .cardType(vipCard.getCardType())
                    .paymentMethod(userVipCard.getPaymentMethods())
                    .cardName(vipCard.getName()).build();

            if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_TIME)){
                userVipCardInfoVO.setExpirationDay((System.currentTimeMillis()-userVipCard.getCreateTime().getTime())/DateUnit.DAY.getMillis());
            }

            else if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_MONEY)){
                userVipCardInfoVO.setRemainAmount(userVipCard.getRemainAmount());
            }
            else {
                userVipCardInfoVO.setRemainCount(userVipCard.getUserCardCount());
            }


            return userVipCardInfoVO;
        }

        ).collect(Collectors.toList());
        return userVipCardInfoVOS;
    }

    @Override
    public Boolean addUserCardInfo(AddUserVipCardDto addUserVipCardDto) {
        UserVipCard userVipCard=new UserVipCard();
        userVipCard.setUserId(addUserVipCardDto.getUserId());
        userVipCard.setVipCardId(addUserVipCardDto.getCardId());
        //获取会员卡信息
        VipCard vipCard = vipCardService.getById(addUserVipCardDto.getCardId());

        if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_COUNT)){
            log.info("添加了次卡");
            userVipCard.setUserCardCount(vipCard.getCardCount());

        }
        if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_TIME)) {
            log.info("添加了期卡");

        }
        if(vipCard.getCardType().equals(VipCardConstant.CARD_TYPE_MONEY)) {
            log.info("添加了储值卡");
            userVipCard.setRemainAmount(vipCard.getSellingPrice());
        }
        userVipCard.setCardStatus((short) 0);
        userVipCard.setRemark(vipCard.getRemark());
        userVipCard.setAmountReceived(vipCard.getSellingPrice());
        // 场馆id
        userVipCard.setVenuesId(addUserVipCardDto.getVenuesId());
        userVipCard.setPaymentMethods("支付宝支付");
        return save(userVipCard);
    }
}
